这是我参与更文挑战的第7天,活动详情查看: 更文挑战
为什么要实现跨域CORS?
在前后端分离开发时,如果前后端非同源(协议/域名/端口不同),无法直接访问,需要使用CORS来解决。详见
初识CORS(AJAX跨源请求解决方案)
Django如何实现跨域CORS?
通过插件django-cors-headers,简单设置后就可以快速实现。django-cors-headers主要利用Django的中间件,在每次请求前先进行CORS相关的处理。
django-cors-headers使用流程
安装插件
pip install django-cors-headers
添加应用
INSTALLED_APPS = (
...
'corsheaders',
...
)
添加中间件
MIDDLEWARE = [
...,
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...,
]
# CorsMiddleware应该放在尽可能前的位置,尤其是在任何可以生成响应的中间件之前
# 例如 DjangoCommonMiddleware,如果不在此之前,它将无法将 CORS 标头添加到这些响应中。
设置
在setting.py中添加相关配置信息
# 最简单的配置
# 凡是出现在白名单中的域名,都可以访问后端接口
CORS_ALLOWED_ORIGINS = (
'127.0.0.1:8080',
'localhost:8080',
'www.example.com:8080',
'api.example.com:8000'
)
# CORS_ALLOW_CREDENTIALS 指明在跨域访问中,后端是否支持对cookie的操作。
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
# 配置详解
# [ 必须项 ] 至少包含一个访问控制:CORS_ALLOWED_ORIGINS、CORS_ALLOWED_ORIGIN_REGEXES、CORS_ALLOW_ALL_ORIGINS
## 发出访问请求的源列表,默认为[]
CORS_ALLOWED_ORIGINS = [
"https://example.com" ,
"https://sub.example.com" ,
"http://localhost:8080" ,
"http://127.0.0.1:9000"
]
## 发出访问请求的使用正则表达式匹配的源列表,默认为[]
CORS_ALLOWED_ORIGIN_REGEXES = [
r"^https://\w+\.example\.com$" ,
]
## 是否允许所有来源,默认为False
### 如果True,则允许所有来源。其他限制允许来源的设置将被忽略【危险行为】
CORS_ALLOW_ALL_ORIGINS
# [ 可选项 ]
## 限制部分URL使用CORS:限制将发送 CORS 标头的 URL 的正则表达式。
### 默认为r'^.*$',即匹配所有 URL。当只需要站点的一部分使用 CORS 时很有用,例如/api/.
CORS_URLS_REGEX = r'^/api/.*$'
## 允许用于实际请求的 HTTP 动词列表
CORS_ALLOW_METHODS = [
'DELETE' ,
'GET' ,
'OPTIONS' ,
'PATCH' ,
'POST' ,
'PUT' ,
]
## 可使用的非标准 HTTP 标头列表
CORS_ALLOW_HEADERS = [
'accept' ,
'accept-encoding' ,
'authorization' ,
'content-type' ,
'dnt' ,
'origin' ,
'user-agent' ,
'x-csrftoken' ,
'x-requested-with' ,
]
## 要向浏览器公开的 HTTP 标头列表,默认为 []
CORS_EXPOSE_HEADERS = []
## 非简单请求免预检时间:单位为秒,默认86400(一天);为0则不会发送,即不免预检
CORS_PREFLIGHT_MAX_AGE = 86400
## 请求是否包含Cookie:如果True,将允许 cookie 包含在跨站点 HTTP 请求中。默认为False.
CORS_ALLOW_CREDENTIALS = true
|